import com.kiwi.nixu.common.LNode;

/**
 * 元素的指针，要求把结点5删掉，删除后链表变为1→2→3→4→6→7
 */
public class K如何在只给定单链表中某个节点的指针的情况下删除该节点 {

    /**
     * 分析与解答：一般而言，要删除单链表中的一个结点p，首先需要找到结点p的前驱结点pre，
     * 然后通过pre.next=p.next来实现对结点p的删除。
     * 对于本题而言，由于无法获取到结点p的前驱结点，因此，
     * 不能采用这种传统的方法。那么如何解决这个问题呢？
     * 可以分如下两种情况来分析：
     * 1）如果这个结点是链表的最后一个结点，那么无法删除这个结点。
     * 2）如果这个结点不是链表的最后一个结点，可以通过把其后继结点的数据复制到当前结点中，然后用删除后继结点的方法来实现
     */


    public static void printList(LNode head) {
        for (LNode cur = head.next; cur != null; cur = cur.next) {
            System.out.print(cur.data);
        }
    }

    public static boolean removeNode(LNode p) {
        if (p == null || p.next == null) {
            return false;
        }
        p.data = p.next.data;
        LNode tmp = p.next;
        p.next = tmp.next;
        return true;
    }

    public static void main(String[] args) {
        int i = 1;
        LNode head = new LNode();
        head.next = null;
        LNode tmp = null;
        LNode cur = head;
        LNode p = null;
        for (; i < 8; i++) {
            tmp = new LNode();
            tmp.data = i;
            tmp.next = null;
            cur.next = tmp;
            cur = tmp;
            if (i == 5) {
                p = tmp;
            }
        }
        System.out.print("删除节点" + p.data + "前链表:");
        printList(head);
        boolean result = removeNode(p);
        if (result) {
            System.out.print("\n删除该节点后链表：");
            printList(head);
        }
    }
}
